package mybatis.interfaces;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.*;

/**
 * 使用 or 连接的 = 操作
 *
 * @author CKC
 */
public interface IFilterOrQueryCondition extends Serializable {

    /**
     * 等于，逻辑或连接，相同字段or，不同字段or，eg: filterOr[type]=user&filterOr[type]=userGroup&filterOr[name]=name1 表示 (type = 'userGroup' or type = 'user') or name = 'name1'
     * <p>
     * 备注：为了与SwaggerUI结合，产生Swagger文档
     *
     * @return
     */
    @ApiModelProperty(name = "filterOr[?]", value = "等于，逻辑或连接，相同字段or，不同字段or，eg: filterOr[type]=user&filterOr[type]=userGroup&filterOr[name]=name1 表示 (type = 'userGroup' or type = 'user') or name = 'name1' ")
    @JsonIgnore
    default String getFilterOrSwaggerView() {
        return null;
    }

    /**
     * getFilterOr
     *
     * @return
     * @see #getFilterOrSwaggerView()
     */
    Map<String, List<String>> getFilterOr();


    /**
     * setFilterOr
     *
     * @param filterOr
     * @see #getFilterOrSwaggerView
     */
    void setFilterOr(Map<String, List<String>> filterOr);

    /**
     * getFilterOrByField
     *
     * @param field
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default List<String> getFilterOr(String field) {
        if (getFilterOr() != null) {
            return getFilterOr().get(field);
        } else {
            return null;
        }
    }

    /**
     * addFilterOr
     *
     * @param field
     * @param values
     * @see #getFilterOrSwaggerView
     */
    default void addFilterOr(String field, String... values) {
        if (getFilterOr() == null) {
            setFilterOr(new HashMap<>(8));
        }
        if (getFilterOr().get(field) == null) {
            getFilterOr().put(field, new ArrayList<>(Arrays.asList(values)));
        } else {
            getFilterOr().get(field).addAll(Arrays.asList(values));
        }
    }

    /**
     * setFilterOr(null)
     *
     * @see #getFilterOrSwaggerView
     */
    default void clearFilterOr() {
        setFilterOr(null);
    }

    /**
     * removeByField
     *
     * @param field
     * @see #getFilterOrSwaggerView
     */
    default void clearTypeFilterOr(String field) {
        if (getFilterOr() == null) {
            return;
        }
        getFilterOr().remove(field);
    }

    /**
     * isEmptyFilterOr
     *
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default boolean isEmptyFilterOr() {
        return getFilterOr() == null || getFilterOr().isEmpty();
    }
}
